package com.example.pcl.utils;


import com.example.pcl.constant.JwtClaimsConstant;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;

/**
 * jwt工具类
 */
public class JwtUtil {

    /**
     * 生成jwt
     * 使用Hs256算法, 私匙使用固定秘钥
     *
     * @param secretKey jwt秘钥
     * @param ttlMillis jwt过期时间(毫秒)
     * @param claims    设置的信息
     * @return token
     */
    public static String createJwt(String secretKey, Long ttlMillis, Map<String, Object> claims) {
        SignatureAlgorithm algorithm = SignatureAlgorithm.HS256;
        Date date = new Date(System.currentTimeMillis() + ttlMillis);

        return Jwts.builder()
                .setClaims(claims)
                .signWith(algorithm, secretKey.getBytes(StandardCharsets.UTF_8))
                .setExpiration(date).compact();

    }

    /**
     * Token解密
     *
     * @param secretKey jwt秘钥 此秘钥一定要保留好在服务端, 不能暴露出去, 否则sign就可以被伪造, 如果对接多个客户端建议改造成多个
     * @param token     加密后的token
     * @return map
     */
    public static Claims parseToken(String secretKey, String token) {
        return Jwts.parser().setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8)).parseClaimsJws(token).getBody();
    }


    public static long parseTokenId(String s, String token) {
        return Long.parseLong(Jwts.parser().setSigningKey(s.getBytes(StandardCharsets.UTF_8))
                .parseClaimsJws(token).getBody().get(JwtClaimsConstant.EMP_ID).toString());
    }
}
